📝 Резюме · 📄 Оригинал (980 B)
https://t.me/Python_libr/3366

Шпаргалка по операциям контейнерных типов

Источник: https://t.me/Python_libr/3366


Что такое контейнеры?

Контейнеры (коллекции, структуры данных) — это типы Python, способные содержать несколько объектов. Вместо трёх переменных name1, name2, name3 — создаёте один контейнер и работаете со всеми тремя скопом.

Основные контейнерные типы

# Список (list) - изменяемый, упорядоченный
my_list = [1, 2, 3, 'текст', 3.14]

# Кортеж (tuple) - неизменяемый, упорядоченный
my_tuple = (1, 2, 3, 'текст')

# Словарь (dict) - пары ключ-значение, изменяемый
my_dict = {'имя': 'Иван', 'возраст': 30, 'город': 'Москва'}

# Множество (set) - уникальные элементы, неупорядоченный
my_set = {1, 2, 3, 3, 2}  # {1, 2, 3} - дубликаты удалены

# Неизменяемое множество (frozenset)
my_frozenset = frozenset([1, 2, 3])

Операции со списками

lst = [1, 2, 3, 4, 5]

# Доступ по индексу
print(lst[0])           # 1 (первый элемент)
print(lst[-1])          # 5 (последний элемент)

# Срезы (slicing)
print(lst[1:4])         # [2, 3, 4]
print(lst[:3])          # [1, 2, 3]
print(lst[2:])          # [3, 4, 5]
print(lst[::2])         # [1, 3, 5] (каждый второй)
print(lst[::-1])        # [5, 4, 3, 2, 1] (в обратном порядке)

# Добавление и удаление
lst.append(6)           # [1, 2, 3, 4, 5, 6]
lst.extend([7, 8])      # [1, 2, 3, 4, 5, 6, 7, 8]
lst.insert(0, 0)        # [0, 1, 2, 3, 4, 5, 6, 7, 8]
lst.remove(3)           # Удаляет первое вхождение 3
removed = lst.pop()     # Удаляет последний и возвращает его

# Поиск
print(lst.index(2))     # Индекс элемента 2
print(lst.count(2))     # Сколько раз 2 встречается

# Сортировка
lst.sort()              # Сортирует на месте
sorted_lst = sorted(lst) # Возвращает новый отсортированный список

Операции с кортежами

tpl = (1, 2, 3, 'текст', 3.14)

# Те же операции доступа как в списках
print(tpl[0])           # 1
print(tpl[1:3])         # (2, 3)
print(tpl[-1])          # 3.14

# Но нельзя изменять!
# tpl[0] = 10           # TypeError!

# Полезные операции
print(len(tpl))         # 5
print(2 in tpl)         # True
print(tpl.count(3))     # 1
print(tpl.index(2))     # 1

# Распаковка
a, b, c, d, e = tpl
print(a)                # 1
print(b)                # 2

# Неполная распаковка
first, *middle, last = tpl
print(first)            # 1
print(middle)           # [2, 3, 'текст', 3.14]
print(last)             # 3.14

Операции со словарями

d = {'имя': 'Иван', 'возраст': 30, 'город': 'Москва'}

# Доступ и установка
print(d['имя'])         # Иван
d['профессия'] = 'инженер'  # Добавит новый ключ

# Безопасный доступ
print(d.get('имя'))     # Иван
print(d.get('телефон', 'не указан'))  # не указан

# Проверка наличия ключа
if 'возраст' in d:
    print(d['возраст'])

# Итерация
for ключ in d:
    print(f"{ключ}: {d[ключ]}")

# Методы
d.keys()                # dict_keys(['имя', 'возраст', ...])
d.values()              # dict_values(['Иван', 30, ...])
d.items()               # dict_items([('имя', 'Иван'), ...])

# Удаление
del d['город']          # Удаляет 'город'
removed_val = d.pop('профессия')  # Удаляет и возвращает

# Слияние (Python 3.9+)
d2 = {'язык': 'Python'}
d_merged = d | d2       # Объединённый словарь

Операции со множествами

s = {1, 2, 3, 4, 5}
s2 = {4, 5, 6, 7}

# Добавление и удаление
s.add(10)               # Добавляет 10
s.remove(3)             # Удаляет 3 (ошибка если нет)
s.discard(99)           # Удаляет 99 (нет ошибки если нет)

# Операции множеств
print(s | s2)           # Объединение {1, 2, 3, 4, 5, 6, 7}
print(s & s2)           # Пересечение {4, 5}
print(s - s2)           # Разность {1, 2, 3}
print(s ^ s2)           # Симметричная разность {1, 2, 3, 6, 7}

# Проверки
print(s2.issubset(s))   # Подмножество ли s2?
print(s.issuperset(s2)) # Надмножество ли s?

# Удаление дубликатов
lst = [1, 2, 2, 3, 3, 3, 4]
unique = set(lst)       # {1, 2, 3, 4}

Диаграмма типов и их свойств

graph TD
    A["Контейнерные типы"]
    A --> B["Упорядоченные"]
    A --> C["Неупорядоченные"]

    B --> D["List<br/>Изменяемый"]
    B --> E["Tuple<br/>Неизменяемый"]

    C --> F["Dict<br/>Пары K-V<br/>Изменяемый"]
    C --> G["Set<br/>Уникальные<br/>Изменяемый"]
    C --> H["FrozenSet<br/>Уникальные<br/>Неизменяемый"]

Сравнение производительности

import time

# Список vs Кортеж: создание
start = time.time()
lst = [i for i in range(1000000)]
print(f"List: {time.time() - start:.4f}s")

start = time.time()
tpl = tuple(range(1000000))
print(f"Tuple: {time.time() - start:.4f}s")

# Поиск элемента: список vs множество
start = time.time()
lst = list(range(100000))
99999 in lst
print(f"List search: {time.time() - start:.6f}s")

start = time.time()
s = set(range(100000))
99999 in s
print(f"Set search: {time.time() - start:.6f}s")

Лучшие практики

  1. Используйте список для изменяемых коллекций
  2. Используйте кортеж для неизменяемых данных и ключей dict
  3. Используйте словарь для поиска по ключу
  4. Используйте множество для проверки вхождения и уникальности
  5. Выбирайте тип в зависимости от задачи, а не наоборот
  6. Помните о производительности: множества намного быстрее для поиска
  7. Документируйте структуру сложных контейнеров